package com.aegis.core.utils;

import cn.dev33.satoken.context.SaHolder;

import java.lang.reflect.Array;
import java.util.Collection;
import java.util.Map;

/**
 * @Author wuweixin
 *
 * @Version 1.0
 * @Descritube
 */
public class AegisCommonUtil {

    private AegisCommonUtil() {
        throw new UnsupportedOperationException("Utility class");
    }

    /**
     * 判断数组是否为空（支持任意类型数组，包括原始类型数组）
     *
     * @param array 数组对象
     * @return true表示数组为null或空数组
     * @throws IllegalArgumentException 如果参数不是数组类型
     */
    public static boolean isArrayEmpty(Object array) {
        if (array == null) {
            return true;
        }
        if (!array.getClass().isArray()) {
            throw new IllegalArgumentException("参数必须为数组类型");
        }
        return Array.getLength(array) == 0;
    }

    /**
     * 判断字符串是否为空（null或空字符串）
     *
     * @param str 字符串
     * @return true表示字符串为null或空字符串
     */
    public static boolean isStringEmpty(String str) {
        return str == null || str.isEmpty();
    }

    /**
     * 判断字符串是否为空白（null或仅包含空白字符）
     *
     * @param str 字符串
     * @return true表示字符串为null或全为空白字符
     */
    public static boolean isStringBlank(String str) {
        return str == null || str.trim().isEmpty();
    }

    /**
     * 判断集合是否为空（支持List/Set/Queue等所有Collection子类）
     * @param collection 集合对象
     * @return true表示集合为null或空集合
     */
    public static boolean isCollectionEmpty(Collection<?> collection) {
        return collection == null || collection.isEmpty();
    }

    /**
     * 判断Map是否为空
     * @param map map对象
     * @return true表示map为null或空map
     */
    public static boolean isMapEmpty(Map<?, ?> map) {
        return map == null || map.isEmpty();
    }

    /**
     * 通用对象空判断（自动识别集合类型）
     * @param obj 任意对象
     * @return 对于集合类型返回isEmpty，普通对象判断null
     */
    public static boolean isEmpty(Object obj) {
        if (obj == null) return true;

        if (obj instanceof Collection) {
            return ((Collection<?>) obj).isEmpty();
        }
        if (obj instanceof Map) {
            return ((Map<?, ?>) obj).isEmpty();
        }
        if (obj.getClass().isArray()) {
            return Array.getLength(obj) == 0;
        }
        if (obj instanceof CharSequence) {
            return ((CharSequence) obj).length() == 0;
        }
        return false;
    }

    /**
     * @return
     */
    public static String getClientIp() {
        String ip = SaHolder.getRequest().getHeader("X-Forwarded-For");
        if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {
            ip = SaHolder.getRequest().getHeader("Proxy-Client-IP");
        }
        if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {
            ip = SaHolder.getRequest().getHeader("WL-Proxy-Client-IP");
        }
//        if (ip == null || ip.isEmpty() || "unknown".equalsIgnoreCase(ip)) {
//            ip = (String) SaHolder.getRequest().getSource(); // 获取来源 IP
//        }
        return ip;
    }
}
